package com.capgemini.scaffold.user;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.capgemini.scaffold.common.BusinessException;
import com.capgemini.scaffold.common.ExceptionEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    UserMapper userMapper;

    @Override
    public User add(User user) {
        // 获取系统当前时间，即为默认创建时间和更新时间
        Date date = new Date();
        // 创建时间和更新时间格式化
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        // 设置创建时间和更新时间
        user.setCreateAt(simpleDateFormat.format(date));
        user.setUpdateAt(simpleDateFormat.format(date));
        // userAccount重复判断
        LambdaQueryWrapper<User> qw = Wrappers.lambdaQuery();
        qw.eq(User::getUserAccount, user.getUserAccount());
        List<User> existUserAccount = userMapper.selectList(qw);
        // 如果存在则抛出业务异常
        if (CollectionUtils.isNotEmpty(existUserAccount)) {
            throw new BusinessException(ExceptionEnum.DUPLICATE_USER_ACCOUNT);
        }
        // 插入用户信息
        userMapper.insert(user);
        return user;
    }

    @Override
    public int delete(Integer id) {
        return userMapper.deleteById(id);
    }

    @Override
    public int update(User user) {
        // 获取系统当前时间，即为更新时间
        Date date = new Date();
        // 更新时间格式化
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        // 设置更新时间
        user.setUpdateAt(simpleDateFormat.format(date));
        // userAccount重复判断
        LambdaQueryWrapper<User> qw = Wrappers.lambdaQuery();
        // id != xx
        qw.ne(User::getId, user.getId())
            // user_account = "xxx"
            .eq(User::getUserAccount, user.getUserAccount());
        List<User> existUserList = userMapper.selectList(qw);
        // 如果存在则抛出业务异常
        if (CollectionUtils.isNotEmpty(existUserList)) {
            throw new BusinessException(ExceptionEnum.DUPLICATE_USER_ACCOUNT);
        }
        // 执行更新操作
        return userMapper.updateById(user);
    }

    @Override
    public User get(Integer id) {
        return userMapper.selectById(id);
    }

    /**
     * 查询用户信息表，入参均为非必填
     *   userAccount：精确查询
     *   userName：模糊查询
     *   startTime：CREATE_AT 大于等于 startTime
     *   endTime：CREATE_AT 小于 endTime
     *
     * @param req 查询请求入参对象
     * @return 用户信息列表
     */
    @Override
    public List<User> queryUser(UserReq req) {
        return userMapper.queryUser(req);
    }

    /**
     * 分页查询用户信息
     *
     * @param req 查询请求入参
     * @return 查询结果
     */
    @Override
    public IPage<User> queryUserPage(UserReq req) {
        //封装分页信息，第一个参数页码值、第二个参数每页显示数量
        Page<User> page = new Page<>(req.getPageNum(), req.getPageSize());
        //进行分页查询
        IPage<User> pageList = userMapper.queryUser(page, req);
        //获取分req
        return pageList;
    }
}
